package com.cn.mapper;

import com.cn.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 3.2 参数传递与接收
 */
public interface UserMapper1 {
    /**
     * 3.2.1 传递和接收单个普通类型参数
     * 当传递单个普通类型参数（例如，基本数据类型，包装类型，字符串等）时，映射中的占位符#{}里可以使用任意字符接收传递过来的参数。但是为了提高代码的可读性，建议与原参数名保持一致。
     * @param id
     * @return
     */
    User queryUserById(int id);

    /**
     * 3.2.2 传递和接收多个普通类型参数
     * arg从0开始
     * param从1开始
     */
    List<User> queryUsersByUsernameAndGender(String username, String gender);

    /**
     * 3.2.3 利用@Param注解传递多个普通类型参数
     * @param username
     * @param gender
     * @return
     */
    List<User> queryUsersByUsernameOrGender(@Param("username") String username, @Param("gender") String gender);

    /**
     * 3.2.4 传递和接收单个POJO参数
     * 当传入的参数是单个POJO时，映射文件的占位符中可使用#{POJO的属性名}的形式获取对应参数
     * @param user
     * @return
     */
    int insertUser(User user);


    /**
     * 3.2.5 传递和接收多个POJO参数
     * 当传递的参数是多个POJO参数时可使用#{paramN.POJO的属性名}或{argN.POJO的属性名}的形式获取对应的参数
     * @throws IOException
     */
    List<User> queryUsersByTwoUser(User firstUser,User secondUser);

    /**
     * 3.2.6 利用@Param注解传递多个POJO类型参数
     * @param fu
     * @param su
     * @return
     */
    List<User> queryUsersByTwoUserWithParam(@Param("firstUser")User fu,@Param("secondUser")User su);

    /**
     * 3.2.7 传递和接收Map类型参数
     * 使用#{Map的key}的形式获取键所对应的值
     * @param paramMap
     * @return
     */
    List<User> queryUsersByMap(Map<String, Object> paramMap);

    /**
     * 3.2.8 传递和接收List类型参数
     * 当传递的参数是List类型时，在映射文件中需使用foreach迭代获取参数。
     */
    List<User> queryUsersByList(@Param("idList") List<Integer> list);

    /**
     * 3.2.9 传递和接收数组类型参数
     * 与传递的参数是List类型类似，在传递数组类型的参数时，在映射文件中需使用foreach迭代获取参数
     */
    List<User> queryUsersByArray(@Param("idArray") int[] array);
}
